package facilius.controller.action.espaco;

import facilius.controller.NotaTransient;
import facilius.model.ServiceLocator;
import facilius.model.pojo.UsuarioCurso;
import facilius.model.pojo.ValorNota;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.mentawai.core.BaseAction;

/**
 *
 * @author Graciano
 */
public class EspacoNotasReadAction extends BaseAction {

    @Override
    public String execute() throws Exception {
        String consequence = ERROR;
        try {
            Map<String, Object> criteria = new HashMap<String, Object>();
            criteria.put("usuarioId", session.getAttribute("userId").toString());
            List<UsuarioCurso> users = ServiceLocator.getUsuarioCursoService().readByCriteria(criteria);

            Map<String, String> cursos = new HashMap<String, String>();
            for (int i = 0; i < users.size(); i++) {
                cursos.put(users.get(i).getCurso().getId().toString(), users.get(i).getCurso().getDescricao());
            }
            output.setValue("cursoOptions", cursos);


            if (cursos.size() > 0) {

                Long curso = input.getLong("cursoId");
                Integer ano = input.getInt("ano");
                List<UsuarioCurso> usuarioCurso = null;

//                if (curso == -1) {
//                    curso = users.get(0).getCurso().getId();
//                }

                if (curso != null && curso > 0) {
                    Map<String, Object> criteriaNotas = new HashMap<String, Object>();
                    criteriaNotas.put("usuarioId", session.getAttribute("userId").toString());
                    criteriaNotas.put("cursoId", curso);
                    usuarioCurso = ServiceLocator.getUsuarioCursoService().readByCriteria(criteriaNotas);

                    criteriaNotas = new HashMap<String, Object>();
                    criteriaNotas.put("matricula", usuarioCurso.get(0).getMatricula());
                    
                    if (ano == null || ano <= 0){
                        Calendar cal = Calendar.getInstance();  
                        ano = cal.get(Calendar.YEAR);  
                    }
                    criteriaNotas.put("ano", ano);
                    output.setValue("ano", ano);

                    List<ValorNota> notas = ServiceLocator.getValorNotaservice().readByCriteria(criteriaNotas);


                    HashMap<String, HashMap<String, Float>> mapNotas = new HashMap<String, HashMap<String, Float>>();

                    for (int i = 0; i < notas.size(); i++) {
                        
                        ValorNota nota = notas.get(i);
                        String key = nota.getUsuarioCursoTurma().getTurma().getDisciplina().getDescricao() + "*" + nota.getUsuarioCursoTurma().getTurma().getAno();

                        HashMap<String, Float> auxNota = mapNotas.get(key);

                        if (auxNota == null){
                            auxNota = new HashMap<String, Float>();
                            auxNota.put("1", 0f);
                            auxNota.put("2", 0f);
                            auxNota.put("3", 0f);
                            auxNota.put("4", 0f);
                        }

                        if (nota.getTipoNota().getDescricao().equalsIgnoreCase("1º Bimestre")) {
                            auxNota.put("1", nota.getValor());
                        }
                        if (nota.getTipoNota().getDescricao().equalsIgnoreCase("2º Bimestre")) {
                            auxNota.put("2", nota.getValor());
                        }
                        if (nota.getTipoNota().getDescricao().equalsIgnoreCase("3º Bimestre")) {
                            auxNota.put("3", nota.getValor());
                        }
                        if (nota.getTipoNota().getDescricao().equalsIgnoreCase("4º Bimestre")) {
                            auxNota.put("4", nota.getValor());
                        }

                        mapNotas.put(nota.getUsuarioCursoTurma().getTurma().getDisciplina().getDescricao() + "*" + nota.getUsuarioCursoTurma().getTurma().getAno(), auxNota);
                    }

                    List<NotaTransient> notasTransient = new ArrayList<NotaTransient>();
                    Iterator<String> itNotas = mapNotas.keySet().iterator();
                    while (itNotas.hasNext()) {
                        String key = itNotas.next();
                        HashMap<String, Float> auxNota = mapNotas.get(key);

                        NotaTransient nT = new NotaTransient(key.substring(key.indexOf("*")+1) + " - " + key.substring(0, key.indexOf("*")), auxNota.get("1"), auxNota.get("2"), auxNota.get("3"), auxNota.get("4"));
                        notasTransient.add(nT);

                    }
                    output.setValue("pojos", notasTransient);

                }


            }
            consequence = SUCCESS;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return consequence;
    }
}
